const fs = require('fs-extra');
const path = require('path');
const chalk = require('chalk');

/**
 * 日志记录器类
 */
class Logger {
  constructor() {
    this.logDir = path.join(process.cwd(), '.tyg-logs');
    this.logFile = path.join(this.logDir, 'tyg-cli.log');
    this.init();
  }

  /**
   * 初始化日志目录
   */
  async init() {
    try {
      await fs.ensureDir(this.logDir);
    } catch (error) {
      // 如果无法创建日志目录，静默处理
    }
  }

  /**
   * 格式化时间戳
   * @returns {string} 格式化的时间戳
   */
  getTimestamp() {
    return new Date().toISOString();
  }

  /**
   * 写入日志文件
   * @param {string} level - 日志级别
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  async writeToFile(level, message, data = null) {
    try {
      const timestamp = this.getTimestamp();
      const logEntry = {
        timestamp,
        level,
        message,
        data
      };
      
      const logLine = JSON.stringify(logEntry) + '\n';
      await fs.appendFile(this.logFile, logLine);
    } catch (error) {
      // 如果无法写入日志文件，静默处理
    }
  }

  /**
   * 信息日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  info(message, data = null) {
    console.log(chalk.blue(`[INFO] ${message}`));
    this.writeToFile('INFO', message, data);
  }

  /**
   * 成功日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  success(message, data = null) {
    console.log(chalk.green(`[SUCCESS] ${message}`));
    this.writeToFile('SUCCESS', message, data);
  }

  /**
   * 警告日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  warn(message, data = null) {
    console.log(chalk.yellow(`[WARN] ${message}`));
    this.writeToFile('WARN', message, data);
  }

  /**
   * 错误日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  error(message, data = null) {
    console.error(chalk.red(`[ERROR] ${message}`));
    this.writeToFile('ERROR', message, data);
  }

  /**
   * 调试日志
   * @param {string} message - 日志消息
   * @param {Object} data - 附加数据
   */
  debug(message, data = null) {
    if (process.env.DEBUG) {
      console.log(chalk.gray(`[DEBUG] ${message}`));
      this.writeToFile('DEBUG', message, data);
    }
  }

  /**
   * 清理日志文件
   * @param {number} days - 保留天数
   */
  async cleanLogs(days = 7) {
    try {
      if (await fs.pathExists(this.logFile)) {
        const stats = await fs.stat(this.logFile);
        const now = new Date();
        const fileTime = new Date(stats.mtime);
        const diffDays = (now - fileTime) / (1000 * 60 * 60 * 24);
        
        if (diffDays > days) {
          await fs.remove(this.logFile);
          this.info(`清理了 ${diffDays.toFixed(1)} 天前的日志文件`);
        }
      }
    } catch (error) {
      this.error('清理日志文件失败', { error: error.message });
    }
  }
}

module.exports = Logger;
